home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Online / SpeakFreely / src / blowfish / asm / x86ms.pl < prev    next >
Perl Script  |  2000-05-18  |  3KB  |  250 lines

  1. #!/usr/local/bin/perl
  2.  
  3. package x86ms;
  4.  
  5. $label="L000";
  6.  
  7. %lb=(    'eax',    'al',
  8.     'ebx',    'bl',
  9.     'ecx',    'cl',
  10.     'edx',    'dl',
  11.     'ax',    'al',
  12.     'bx',    'bl',
  13.     'cx',    'cl',
  14.     'dx',    'dl',
  15.     );
  16.  
  17. %hb=(    'eax',    'ah',
  18.     'ebx',    'bh',
  19.     'ecx',    'ch',
  20.     'edx',    'dh',
  21.     'ax',    'ah',
  22.     'bx',    'bh',
  23.     'cx',    'ch',
  24.     'dx',    'dh',
  25.     );
  26.  
  27. sub main'LB
  28.     {
  29.     (defined($lb{$_[0]})) || die "$_[0] does not have a 'low byte'\n";
  30.     return($lb{$_[0]});
  31.     }
  32.  
  33. sub main'HB
  34.     {
  35.     (defined($hb{$_[0]})) || die "$_[0] does not have a 'high byte'\n";
  36.     return($hb{$_[0]});
  37.     }
  38.  
  39. sub main'DWP
  40.     {
  41.     local($addr,$reg1,$reg2,$idx)=@_;
  42.     local($t);
  43.     local($ret)="DWORD PTR ";
  44.  
  45.     $addr =~ s/^\s+//;
  46.     if ($addr =~ /^(.+)\+(.+)$/)
  47.         {
  48.         $reg2=&conv($1);
  49.         $addr="_$2";
  50.         }
  51.     elsif ($addr =~ /^[_a-zA-Z]/)
  52.         {
  53.         $addr="_$addr";
  54.         }
  55.  
  56.     $reg1="$regs{$reg1}" if defined($regs{$reg1});
  57.     $reg2="$regs{$reg2}" if defined($regs{$reg2});
  58.     $ret.=$addr if ($addr ne "") && ($addr ne 0);
  59.     if ($reg2 ne "")
  60.         {
  61.         $t="";
  62.         $t="*$idx" if ($idx != 0);
  63.         $ret.="[$reg2$t+$reg1]";
  64.         }
  65.     else
  66.         {
  67.         $ret.="[$reg1]"
  68.         }
  69.     return($ret);
  70.     }
  71.  
  72. sub main'mov    { &out2("mov",@_); }
  73. sub main'movb    { &out2("mov",@_); }
  74. sub main'and    { &out2("and",@_); }
  75. sub main'or    { &out2("or",@_); }
  76. sub main'shl    { &out2("shl",@_); }
  77. sub main'shr    { &out2("shr",@_); }
  78. sub main'xor    { &out2("xor",@_); }
  79. sub main'add    { &out2("add",@_); }
  80. sub main'sub    { &out2("sub",@_); }
  81. sub main'rotl    { &out2("rol",@_); }
  82. sub main'rotr    { &out2("ror",@_); }
  83. sub main'exch    { &out2("xchg",@_); }
  84. sub main'cmp    { &out2("cmp",@_); }
  85. sub main'dec    { &out1("dec",@_); }
  86. sub main'jmp    { &out1("jmp",@_); }
  87. sub main'je    { &out1("je",@_); }
  88. sub main'jz    { &out1("jz",@_); }
  89. sub main'jnz    { &out1("jnz",@_); }
  90. sub main'push    { &out1("push",@_); }
  91. sub main'call    { &out1("call",'_'.$_[0]); }
  92.  
  93.  
  94. sub out2
  95.     {
  96.     local($name,$p1,$p2)=@_;
  97.     local($l,$t);
  98.  
  99.     print "\t$name\t";
  100.     $t=&conv($p1).",";
  101.     $l=length($t);
  102.     print $t;
  103.     $l=4-($l+9)/8;
  104.     print "\t" x $l;
  105.     print &conv($p2);
  106.     print "\n";
  107.     }
  108.  
  109. sub out1
  110.     {
  111.     local($name,$p1)=@_;
  112.     local($l,$t);
  113.  
  114.     print "\t$name\t";
  115.     print &conv($p1);
  116.     print "\n";
  117.     }
  118.  
  119. sub conv
  120.     {
  121.     local($p)=@_;
  122.  
  123.     $p =~ s/0x([0-9A-Fa-f]+)/0$1h/;
  124.     return $p;
  125.     }
  126.  
  127. sub main'file
  128.     {
  129.     local($file)=@_;
  130.  
  131.     print <<"EOF";
  132.     TITLE    $file.asm
  133.         .386
  134. .model FLAT
  135. EOF
  136.     }
  137.  
  138. sub main'function_begin
  139.     {
  140.     local($func,$num)=@_;
  141.  
  142.     $params=$num*4;
  143.  
  144.     print <<"EOF";
  145. _TEXT    SEGMENT
  146. PUBLIC    _$func
  147. EXTRN    _des_SPtrans:DWORD
  148. _$func PROC NEAR
  149.     push    ebp
  150.     push    ebx
  151.     push    esi
  152.     push    edi
  153. EOF
  154.     $stack=20;
  155.     }
  156.  
  157. sub main'function_end
  158.     {
  159.     local($func)=@_;
  160.  
  161.     print <<"EOF";
  162.     pop    edi
  163.     pop    esi
  164.     pop    ebx
  165.     pop    ebp
  166.     ret
  167. _$func ENDP
  168. _TEXT    ENDS
  169. EOF
  170.     $stack=0;
  171.     %label=();
  172.     }
  173.  
  174. sub main'function_end_A
  175.     {
  176.     local($func)=@_;
  177.  
  178.     print <<"EOF";
  179.     pop    edi
  180.     pop    esi
  181.     pop    ebx
  182.     pop    ebp
  183.     ret
  184. EOF
  185.     }
  186.  
  187. sub main'function_end_B
  188.     {
  189.     local($func)=@_;
  190.  
  191.     print <<"EOF";
  192. _$func ENDP
  193. _TEXT    ENDS
  194. EOF
  195.     $stack=0;
  196.     %label=();
  197.     }
  198.  
  199. sub main'file_end
  200.     {
  201.     print "END\n"
  202.     }
  203.  
  204. sub main'wparam
  205.     {
  206.     local($num)=@_;
  207.  
  208.     return(&main'DWP($stack+$num*4,"esp","",0));
  209.     }
  210.  
  211. sub main'wtmp
  212.     {
  213.     local($num)=@_;
  214.  
  215.     return(&main'DWP($stack+$params+$num*4,"esp","",0));
  216.     }
  217.  
  218. sub main'comment
  219.     {
  220.     foreach (@_)
  221.         {
  222.         print "\t; $_\n";
  223.         }
  224.     }
  225.  
  226. sub main'label
  227.     {
  228.     if (!defined($label{$_[0]}))
  229.         {
  230.         $label{$_[0]}="\$${label}${_[0]}";
  231.         $label++;
  232.         }
  233.     return($label{$_[0]});
  234.     }
  235.  
  236. sub main'set_label
  237.     {
  238.     if (!defined($label{$_[0]}))
  239.         {
  240.         $label{$_[0]}="${label}${_[0]}";
  241.         $label++;
  242.         }
  243.     print "$label{$_[0]}:\n";
  244.     }
  245.  
  246. sub main'file_end
  247.         {
  248.     print "END\n";
  249.         }
  250.